home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
prnt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-07
|
45KB
|
2,104 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
int xpp[] = {2,12,26,38,48,58,68,73};
int xpp_2[] = {20,35,46,57};
int prnt_top=0,prnt_last=0,prnt_pitch=0;
int last_pn = -1;
void
prnt_do()
{
int ydot,ydot0,i,ii,lc,pn;
UNIT *wp,*wp0;
UBYTE ws[VERY_LONG_LINE],w0[VERY_LONG_LINE];
int xp;
int prnt_top0,prnt_last0;
line_seigyou();
wp = HEAD->ATO;
lc = 0;
pn = 1;
while(wp != TAIL) {
lc++;
wp = wp->ATO;
}
if (!PRN_JIZUME) {
PRN_JIZUME = CURRENT_JIZUME;
}
prnt_do_disp(xp = 7);
while(1) {
UWORD c;
fep_key_clear();
c = toupper(fep_inkey_raw0());
if ((c == 'M'-'@') || (c == CR) || (c == 'Y')) {
if ((PRN_JIZUME+4)*(12+(PRN_H_PITCH/2))+PRN_LEFT_MARGIN
<= PRN_HDOT) { /* 範囲内に納まっている */
/* +4 は禁則分 */
break;
} else {
under_print0("横幅が制限を越えています。\\
設定し直して下さい[Push 'Y' Key]");
while(1) {
UBYTE c;
etc_beep();
c = toupper(fep_inkey_raw0());
if (c == 'Y') {
break;
}
}
prnt_do_disp(xp);
continue;
}
break;
} else if (c == XF_LEFT_KOHO_KEY) {
if (xp) {
xp--;
} else {
xp = 7;
}
window_abs_loc(xpp[xp],UNDER_Y);
} else if (c == XF_RIGHT_KOHO_KEY) {
if (xp == 7) {
xp = 0;
} else {
xp++;
}
window_abs_loc(xpp[xp],UNDER_Y);
} else if ((c == '['-'@') || (c == 'G'-'@')) {
/* under_print((STR)"印刷を中止しました");*/
return;
} else if (('0' <=c) && (c <= '9')) { /* 数字入力 */
prnt_direct_number(xp,c);
/* prnt_do_disp(xp);*/
} else if ((c == 'V') || (c == 'V'-'@')) { /* pre view */
UBYTE ws[VERY_LONG_LINE];
UBYTE c0;
view_loop:
init_clear_screen();
sprintf(ws,"縮尺率を選んで下さい(1,2,4,8):中止 = [ESC]");
under_print_view(ws);
fep_key_clear();
c0 = toupper(fep_inkey_raw0());
switch(c0) {
case '1':
prnt_view(c,1,1);
break;
case '2':
prnt_view(c,2,2);
break;
case '4':
prnt_view(c,4,4);
break;
case '8':
prnt_view(c,8,8);
break;
case '\x1b': /* ESC */
/* etc_func_on();*/
/* under_blanc();*/
ctrl_l();
break;
default:
etc_beep();
goto view_loop;
}
return;
/* break;*/
} else {
int delta = 0;
if (c == XF_NEXT_BLOCK_KEY) {
delta = -1;
} else if (c == XF_BEFORE_BLOCK_KEY) {
delta = 1;
} else {
/* etc_beep();*/
/* continue;*/
}
if (fep_shift_ctrl() == 0x20) { /* CTRL だ */
delta *= 10;
}
switch(xp) {
case 0:
if (delta) {
PRN_TATE_MODE = !PRN_TATE_MODE;
}
break;
case 1:
PRN_JIZUME = prnt_parm(PRN_JIZUME,delta);
break;
case 2:
PAGE = prnt_parm(PAGE,delta);
break;
case 3:
PRN_UP_MARGIN = prnt_parm(PRN_UP_MARGIN,delta);
break;
case 4:
PRN_LEFT_MARGIN = prnt_parm(PRN_LEFT_MARGIN,delta);
break;
case 5:
PRN_H_PITCH = prnt_parm(PRN_H_PITCH,delta);
break;
case 6:
PRN_V_PITCH = min(prnt_parm(PRN_V_PITCH,delta),50);
break;
default:
break;
}
prnt_do_disp(xp);
}
}
/* 印刷開始 */
prnt_do_disp_2(xp = 3);
while(1) {
UWORD c;
fep_key_clear();
c = toupper(fep_inkey_raw0());
if ((c == 'M'-'@') || (c == CR) || (c == 'Y')) {
break; /* 印刷開始 */
} else if (c == XF_LEFT_KOHO_KEY) {
if (xp) {
xp--;
} else {
xp = 3;
}
window_abs_loc(xpp_2[xp],UNDER_Y);
} else if (c == XF_RIGHT_KOHO_KEY) {
if (xp == 3) {
xp = 0;
} else {
xp++;
}
window_abs_loc(xpp_2[xp],UNDER_Y);
} else if ((c == '['-'@') || (c == 'G'-'@')) {
/* under_print((STR)"印刷を中止しました");*/
return;
} else if (('0' <=c) && (c <= '9')) { /* 数字入力 */
prnt_direct_number2(xp,c);
/* prnt_do_disp(xp);*/
} else {
int delta = 0;
if (c == XF_NEXT_BLOCK_KEY) {
delta = -1;
} else if (c == XF_BEFORE_BLOCK_KEY) {
delta = 1;
} else {
continue;
}
if (fep_shift_ctrl() == 0x20) { /* CTRL だ */
delta *= 10;
}
switch(xp) {
case 0:
prnt_top = prnt_parm(prnt_top,delta);
break;
case 1:
prnt_last = prnt_parm(prnt_last,delta);
break;
case 2:
prnt_pitch = !prnt_pitch;
break;
default:
continue;
break;
}
prnt_do_disp_2(xp);
}
}
under_print0("印刷中…");
if (prnt_out_string(PRN_INIT)) {
return;
}
if (prnt_top0 = prnt_top) {
} else {
prnt_top0 = 1;
}
if (prnt_last0 = prnt_last) {
} else {
prnt_last0 = 99999;
}
if (prnt_top0 <= pn) {
ydot = prnt_do_up_margin();
} else {
ydot = 0;
}
wp = HEAD->ATO;
ii = i = 0;
*w0 = EOS;
while((wp != TAIL) || (*w0)) {
if (!PAGE || (i++ < PAGE)) { /* 1頁行数 */
if (PRN_JIZUME == CURRENT_JIZUME) {
line_get_body(ws,wp);
wp = wp->ATO;
ii++;
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
if (PAGE) {
prnt_repo_ln(ii,lc,pn,i);
} else {
prnt_repo_ln(ii,lc,pn,ii);
}
}
} else {
if (!*w0) { /* w0 が空ならば */
line_get_body(w0,wp);
wp = wp->ATO;
ii++;
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
prnt_repo_ln(ii,lc,pn,i);
}
}
cut_line(w0,ws,w0,PRN_JIZUME);
if (!*w0) { /* 1行取れなかった */
while(1) {
if (wp == TAIL) {
*w0 = EOS;
break;
}
/* 後がある */
strcpy(w0,ws); /* 戻す */
line_cat_body(w0,wp); /* 追加する */
wp = wp->ATO;
ii++;
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
prnt_repo_ln(ii,lc,pn,i);
}
cut_line(w0,ws,w0,PRN_JIZUME);
if (*w0) { /* 1行取れた */
break;
}
}
}
}
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
ydot += prnt_bit_convrt_24(ws,ydot,LYW_UPPER,LYW_MAIN,LYW_UNDER,PRN_JIZUME);
/* 変換する */
}
}
saba:
if (fep_INKEY()) {
if (prnt_check_quit()) {
return;
}
}
if (ydot >= HDOT) { /* 1行をビットイメージ印字できる */
ydot0 = 0;
while((ydot - ydot0) >= HDOT) {
if (prnt_send_1line_to_prn(ydot0,HDOT)) {
return;
}
prnt_out_string(PRN_CRLF);
ydot0 += HDOT;
}
prnt_shift_prnt_buff(ydot0,ydot);
ydot -= ydot0;
goto saba;
} else {
if ((PAGE && (i >= PAGE)) || (wp == TAIL)) {
if (ydot) { /* 1ヘッドに満たない残りがある */
prnt_erase_box(ydot,HDOT);
if (prnt_send_1line_to_prn(0,HDOT)) {
return;
}
prnt_out_string(PRN_CRLF);
ydot = 0;
}
if (wp == TAIL) {
break;
} else { /* PAGE END */
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
if (prnt_ff()) {
return;
}
}
i = 0;
pn++;
if ((prnt_last) && (prnt_last < pn)) {
break; /* 最終指定を越えた */
}
if (prnt_check(prnt_top0,pn,prnt_last0,prnt_pitch)) {
ydot = prnt_do_up_margin();
}
}
}
}
}
prnt_out_string(PRN_RESET);
under_blanc();
}
/* ページ番号をチェック */
int
prnt_check(int prnt_top0,int pn,int prnt_last0,int prnt_pitch)
{
if ((pn < prnt_top0) || (pn > prnt_last0)) {
return(0); /* 範囲から出ている */
}
if (prnt_pitch && ((pn - prnt_top0) & 1)) { /* 1頁おき指定で、差が奇数 */
return(0);
}
return(1);
}
void
prnt_do_disp(int xp)
{
UBYTE ws[VERY_LONG_LINE];
/* 0 1 2 3 4 5 6 7 8
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/
sprintf(ws,
"[%s]印刷,[%3d]字詰め,頁[%3d]行,上幅[%3d],左幅[%3d],横間[%3d],行間[%3d],<NL,←,→,↑,↓,View,ESC>",
PRN_TATE_MODE?"縦":"横",PRN_JIZUME,
PAGE,PRN_UP_MARGIN,PRN_LEFT_MARGIN,PRN_H_PITCH,PRN_V_PITCH);
under_print00(ws);
window_abs_loc(xpp[xp],UNDER_Y);
}
void
prnt_do_disp_2(int xp)
{
UBYTE ws[VERY_LONG_LINE],w0[VERY_LONG_LINE];
int delta;
/* 0 1 2 3 4 5 6 7 8
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/
delta = 0;
strcpy(ws,"\x1b[0K印刷パラメータ:");
if (prnt_top) {
delta = 2;
sprintf(w0,"第[%4d]頁から,",prnt_top);
strcat(ws,w0);
} else {
strcat(ws," 先頭頁から,");
}
if (prnt_last) {
delta = 2;
sprintf(w0,"第[%4d]頁まで,",prnt_last);
strcat(ws,w0);
} else {
strcat(ws," 最終頁まで,");
}
if (prnt_pitch) {
sprintf(w0,"1頁おき",prnt_last);
strcat(ws,w0);
} else {
strcat(ws,"連続 ");
}
strcat(ws,",<NL,←,→,↑,↓,ESC>");
under_print00(ws);
window_abs_loc(xpp_2[xp]+delta,UNDER_Y);
}
void
prnt_repo_ln(int ln,int tl,int pn,int i)
{
UBYTE w[MAXLINE];
sprintf(w," 画面上の全 %d 行中の、第 %d 行目を処理中\\
(第 %d 頁目の %d 行目を印刷中)・・・",tl,ln,pn,i);
under_print0(w);
}
WORD
prnt_parm(WORD parm,int delta)
{
return((parm + delta + 1000) % 1000);
}
int
prnt_bit_convrt_24(STR dd,int ybgn,int u,int m,int l,int jj)
{
register int i,x,xb,y;
register UINT c;
FNTDATA BUF;
int yhaba,yhaba0,xhaba,xhaba0;
int dx,ccount;
UBYTE *dp;
UBYTE ul_flag[PRN_MAX_CHAR];
register int ybgn_u,ybgn_u_m2;
u += (u>>1); /* 1.5 倍 */
m += (m>>1); /* 1.5 倍 */
l += (l>>1); /* 1.5 倍 */
ybgn_u_m2 = (ybgn_u = ybgn+u) + m + 2;
yhaba = u+m+l+PRN_V_PITCH;
prnt_erase_box(ybgn,ybgn+yhaba);
for(i=0;i<PRN_MAX_CHAR;i++) { /* 下線フラグ消去 */
ul_flag[i] = 0;
}
/* ,,, */
dx = PRN_LEFT_MARGIN;
ccount = i = 0;
while(c = dd[i++]) {
x = dx/8; /* 水平バイト */
xb = dx%8; /* 水平ビット */
if (c == XCODE_UP) { /* XCODE である */
switch(dd[i++]) {
register int oldx,newx,worki,worki0;
register int olddx,newdx;
case XCODE_UL: /* 下線だ */
if (l) {
c = *line_skip_xcode(&dd[i]);
if (c == TAB) {
/* 0-7 -> 8, 8-15 -> 16... である */
newx = oldx = ccount;
newx += TAB_LENGTH;
newx -= (newx % TAB_LENGTH);
for(worki=oldx;worki<newx;worki++) {
ul_flag[worki] = 1;
}
} else if (etc_char_disp_len(c) == 1) { /* 半角幅 */
oldx = ccount;
newx = ccount+1;
ul_flag[ccount] = 1;
} else { /* 全角だ */
oldx = ccount;
newx = ccount+2;
ul_flag[ccount] = ul_flag[ccount+1] = 1;
}
newdx = (12+PRN_H_PITCH/2)*newx;
if (oldx && ul_flag[oldx-1]) { /* 左も下線 */
olddx = dx-(12+PRN_H_PITCH/2);
} else {
olddx = dx;
}
/* olddx から newdx へ下線を引く */
worki = olddx/8;
worki0 = newdx/8;
{
UBYTE hanpa[8] = {0,1,3,7,15,31,63,127};
if (olddx % 8) { /* 半端がある */
*((UBYTE *)(&PRN_PAT[ybgn_u_m2][worki++]))
|= hanpa[olddx % 8];
}
while(worki<worki0) {
*((UBYTE *)(&PRN_PAT[ybgn_u_m2][worki++])) |= 0xff;
}
if (newdx % 8) { /* 半端がある */
*((UBYTE *)(&PRN_PAT[ybgn_u_m2][worki]))
|= 255-hanpa[8-(newdx % 8)];
}
}
}
break;
case XCODE_RB10:
c = (dd[i]<<8) | dd[i+1];
i += 2;
if (u) {
prnt_rubi_put(dx+6,ybgn,c);
}
break;
case XCODE_RB1:
case XCODE_RB1L:
c = (dd[i]<<8) | dd[i+1];
i += 2;
if (u) {
prnt_rubi_put(dx,ybgn,c);
}
break;
case XCODE_RB1R:
c = (dd[i]<<8) | dd[i+1];
i += 2;
if (u) {
prnt_rubi_put(dx+12,ybgn,c);
}
break;
case XCODE_RB2:
c = (dd[i]<<8) | dd[i+1];
if (u) {
prnt_rubi_put(dx,ybgn,c);
}
c = (dd[i+2]<<8) | dd[i+3];
i += 4;
if (u) {
prnt_rubi_put(dx+12,ybgn,c);
}
break;
}
continue;
}
if ((c >= 0x80) && (!iskana(c))) {
c = (c<<8) | dd[i++];
} else if (c == CR) { /* 改行である */
continue;
} else if (c == TAB) { /* タブである */
int oldx;
/* 0-7 -> 8, 8-15 -> 16... である */
oldx = ccount;
ccount += TAB_LENGTH;
ccount -= (ccount % TAB_LENGTH);
dx += (12+PRN_H_PITCH/2)*(ccount - oldx);
continue;
}
FNTGET(12,c,&BUF);
if (PRN_TATE_MODE) {
etc_rot_font(c,&BUF);
}
xhaba0 = BUF.xl;
yhaba0 = BUF.yl;
dp = BUF.buffer;
for(y=0;y<yhaba0;y++) {
register UINT p0;
register UBYTE *pb;
if (xhaba0 == 12) { /* 半角だ */
if (p0 = (dp[0]<<16)|(dp[1]<<8)) {
if (x & 1) { /* 奇数 */
*((int *)(pb = &PRN_PAT[ybgn_u+y][x-1])) |= (p0 >> xb);
if (xb) {
pb[4] |= (p0 << (8-xb));
}
} else { /* 偶数 */
*((int *)(&PRN_PAT[ybgn_u+y][x])) |= (p0 << (8-xb));
}
}
dp += 2;
/*printf("[%12b]\n",p0);*/
} else { /* 全角だ */
if ((int)dp & 1) { /* 奇数 */
p0 = *((int *)(dp -1));
} else { /* 偶数 */
p0 = *((int *)(dp)) >> 8;
}
/* p0 = (dp[0]<<16)|(dp[1]<<8)|(dp[2])) {*/
/* if (p0 = (dp[0]<<16)|(dp[1]<<8)|(dp[2])) {*/
if (p0 &= 0xffffff) {
if (x & 1) { /* 奇数 */
*((int *)(pb = &PRN_PAT[ybgn_u+y][x-1])) |= (p0 >> xb);
if (xb) {
pb[4] |= (p0 << (8-xb));
}
} else { /* 偶数 */
*((int *)(&PRN_PAT[ybgn_u+y][x])) |= (p0 << (8-xb));
}
}
dp += 3;
/*printf("[%24b]\n",p0);*/
}
}
if (xhaba0 == 12) { /* 半角だ */
ccount++;
dx += (xhaba0+PRN_H_PITCH/2);
} else {
ccount += 2;
dx += (xhaba0+PRN_H_PITCH);
}
}
return(yhaba);
}
void
prnt_rubi_put(int dx,int ybgn,UWORD c)
{
FNTDATA BUF;
int xhaba0,yhaba0;
register int i,x,xb,y;
UBYTE *dp;
x = dx/8; /* 水平バイト */
xb = dx%8; /* 水平ビット */
FNTGET(12,c,&BUF);
xhaba0 = BUF.xl;
yhaba0 = BUF.yl;
dp = BUF.buffer;
for(y=0;y<yhaba0;y++) {
register int p0;
p0 = (dp[0]<<16)|(dp[1]<<8);
if (x & 1) { /* 奇数 */
*((int *)(&PRN_PAT[ybgn+y][x-1])) |= (p0 >> xb);
if (xb) {
PRN_PAT[ybgn+y][x-1+4] |= (p0 << (8-xb));
}
} else { /* 偶数 */
*((int *)(&PRN_PAT[ybgn+y][x])) |= (p0 << (8-xb));
}
dp += 2;
}
}
/* bgnd から hd ドットまでをプリンタに送り出す */
/* 中断されたかどうかを返す */
int
prnt_send_1line_to_prn(int bgnd,int hd)
{
register int x,b,i,mask;
UBYTE w[HDOT];
UBYTE wd[HDOT][8];
int xjj,xjj8;
xjj = min((PRN_JIZUME+6)*(12+(PRN_H_PITCH/2))+PRN_LEFT_MARGIN
,PRN_PAT_H*8); /* ドット数 */
xjj = (xjj/8) + !!(xjj & 7); /* バイト数(仮) */
/* xjj が0ということはない */
do {
x = xjj-1;
for(i=0;i<HDOT;i++) {
if (PRN_PAT[bgnd+i][x]) { /* 縦24バイトチェック */
goto prnt_found;
}
}
} while(--xjj > 0);
prnt_found:
if (xjj8 = xjj*8) {
if (prnt_bit_in(xjj8)) { /* BIT IN */
return(1);
}
}
for(x=0;x<xjj;x++) {
for(i=0;i<HDOT;i++) {
w[i] = PRN_PAT[bgnd+i][x]; /* 縦24バイト取る */
}
mask = 128; /* wd[][] のマトリックスにコンバート */
for(b=0;b<8;b++) {
for(i=0;i<HDOT;i++) {
wd[i][b] = !!(w[i] & mask);
}
mask >>= 1;
}
if (PRN_MSB_IS_UP) {
for(b=0;b<8;b++) {
mask = 0;
for(i=0;i<8;i++) {
mask |= (wd[i][b] << (7-i));
}
if (prnt_outlpt(mask)) {
return(1);
}
mask = 0;
for(i=8;i<16;i++) {
mask |= (wd[i][b] << (7-(i-8)));
}
if (prnt_outlpt(mask)) {
return(1);
}
mask = 0;
for(i=16;i<24;i++) {
mask |= (wd[i][b] << (7-(i-16)));
}
if (prnt_outlpt(mask)) {
return(1);
}
}
} else {
for(b=0;b<8;b++) {
mask = 0;
for(i=0;i<8;i++) {
mask |= (wd[i][b] << (i));
}
if (prnt_outlpt(mask)) {
return(1);
}
mask = 0;
for(i=8;i<16;i++) {
mask |= (wd[i][b] << (i-8));
}
if (prnt_outlpt(mask)) {
return(1);
}
mask = 0;
for(i=16;i<24;i++) {
mask |= (wd[i][b] << (i-16));
}
if (prnt_outlpt(mask)) {
return(1);
}
}
}
}
return(0);
}
/* 中断が指定されたかどうかを返す */
int
prnt_out_string(STR s)
{
while(*s) {
if (prnt_outlpt(*s++)) {
return(1);
}
}
return(0);
}
/* イメージバッファを上にシフトする */
void
prnt_shift_prnt_buff(int bgnd,int last)
{
register int i,x,c;
for(c=0,i=bgnd;i<last;c++,i++) {
for(x=0;x<PRN_PAT_H;x++) {
PRN_PAT[c][x] = PRN_PAT[i][x];
}
}
}
/* バイト数がパラメータ */
int
prnt_bit_in(int bn)
{
int i,n;
UBYTE f,c;
UBYTE w[MAXLINE];
int bnh,bnl;
for(i=0;c = PRN_GIN[i++];) {
if (prnt_outlpt(c)) {
return(1);
}
}
/* n <D,M,I> で入っている */
n = PRN_GIN[i++];
f = toupper(PRN_GIN[i]);
bnh = bn / 256;
bnl = bn % 256;
switch(f) {
case 'D': /* 10進数アスキーコード */
if ((0 < n) && (n <= 5)) {
sprintf(w,"%05d",bn);
for(i=5-n;i<5;i++) {
if (prnt_outlpt(w[i])) {
return(1);
}
}
} else {
error("プリンタへのパラメータの指定が異常です");
}
break;
case 'I': /* インテル形式 */
i = bnh;
bnh = bnl;
bnl = i; /* SWAP */
case 'M': /* モトローラ形式 */
if (prnt_outlpt(bnh)) {
return(1);
}
if (prnt_outlpt(bnl)) {
return(1);
}
break;
default:
error("プリンタへのパラメータの指定が異常です");
}
}
/*
(TYPE=0) :CZ-8PK8
(PIN=24) (MSBUP=1)
(HDOT=2088) (VDOT=1584)
(HGAP=8) (VGAP=8)
(LEFT_MARGIN=0) (UP_MARGIN=0)
(CRLF=$0d$0a) (FF=$0c)
(GIN=$1b$4a%2m) :2桁のモトローラ順
(INIT=$1b$25$39$10):16/120 inchs
(RESET=$1b$63$31):reset printer
*/
/*
(TYPE=1) :BJ-10V(ESC/P:ただし24pin)
(PIN=24) (MSBUP=1)
(HDOT=1272) (VDOT=1920)
(HGAP=8) (VGAP=8)
(LEFT_MARGIN=0) (UP_MARGIN=0)
(CRLF=$0d$0a) (FF=$0c)
(GIN=$1b$2a$27%2i) :2桁のインテル順
(INIT=$1b$41%08):16/120 inchs
(RESET=$1b$40):reset printer
*/
/*
(TYPE=2) :NM-????
(PIN=24) (MSBUP=0)
(HDOT=1272) (VDOT=1920)
(HGAP=8) (VGAP=8)
(LEFT_MARGIN=0) (UP_MARGIN=0)
(CRLF=$0d$0a) (FF=$0c)
(GIN=$1b$4a%4d) :4桁のアスキーコード
(INIT=$1b$41%0c):16/120 inchs
(RESET=$1b$63$31):reset printer
*/
/*
(TYPE=3) :PC-????
(PIN=24) (MSBUP=0)
(HDOT=1272) (VDOT=1920)
(HGAP=8) (VGAP=8)
(LEFT_MARGIN=0) (UP_MARGIN=0)
(CRLF=$0d$0a) (FF=$0c)
(GIN=$1b$4a%4d) :4桁のアスキーコード
(INIT=$1b$41%0c):16/120 inchs
(RESET=$1b$63$31):reset printer
*/
typedef struct PRN_DEFAULTS_UNIT {
UWORD pin;
UWORD msbup;
UWORD hdot;
UWORD vdot;
UWORD hgap;
UWORD vgap;
UWORD left_margin;
UWORD up_margin;
UBYTE crlf[16];
UBYTE ff[16];
UBYTE gin[16];
UBYTE init[16];
UBYTE reset[16];
UBYTE name[32];
} PRN_DEFAULTS_UNIT;
PRN_DEFAULTS_UNIT PRN_DEFAULTS[] = {
{24,1,2448,1584,8,8,0,0,
"$0d$0a","$0c","$1b$4a%2m","$1b$25$39$10","$1b$63$31","CZ-8PK8"},
{24,1,1272,1920,8,8,0,0,
"$0d$0a","$0c","$1b$2a$27%2i","$1b$41$08","$1b$40","BJ-10V(ESC/P)"},
{24,0,2088,1584,8,8,0,0,
"$0d$0a","$0c","$1b$4a%4d","$1b$54$31$36","$1b$63$31","NM-????"},
{24,0,2088,1584,8,8,0,0,
"$0d$0a","$0c","$1b$4a%4d","$1b$54$31$36","$1b$63$31","PC-????"}
};
/* デフォルトの設定を行う */
void
prnt_set_type()
{
PRN_PIN = PRN_DEFAULTS[PRN_TYPE].pin;
PRN_MSB_IS_UP = PRN_DEFAULTS[PRN_TYPE].msbup;
PRN_HDOT = PRN_DEFAULTS[PRN_TYPE].hdot;
PRN_VDOT = PRN_DEFAULTS[PRN_TYPE].vdot;
PRN_H_PITCH = PRN_DEFAULTS[PRN_TYPE].hgap;
PRN_V_PITCH = PRN_DEFAULTS[PRN_TYPE].vgap;
PRN_LEFT_MARGIN = PRN_DEFAULTS[PRN_TYPE].left_margin;
PRN_UP_MARGIN = PRN_DEFAULTS[PRN_TYPE].up_margin;
init_by_cnf_prn_hex0(PRN_CRLF,PRN_DEFAULTS[PRN_TYPE].crlf);
init_by_cnf_prn_hex0(PRN_FF,PRN_DEFAULTS[PRN_TYPE].ff);
init_by_cnf_prn_hex_gin(PRN_GIN,PRN_DEFAULTS[PRN_TYPE].gin);
init_by_cnf_prn_hex0(PRN_INIT,PRN_DEFAULTS[PRN_TYPE].init);
init_by_cnf_prn_hex0(PRN_RESET,PRN_DEFAULTS[PRN_TYPE].reset);
}
/* 中断が指定されたかどうかを返す */
int
prnt_outlpt(UBYTE c)
{
register int t,t0;
t0 = ONTIME();
while(SNSPRN() == 0) {
if ((t = ONTIME()) < t0) { /* リセットされた */
t += 8640000;
}
if ((t - t0) > PRN_WAIT*100) {
while(1) {
UWORD c;
etc_beep();
under_print0((STR)"プリンタに出力できません。印刷を続行しますか [Y/N]? ");
fep_key_clear();
c = toupper(fep_inkey_raw0());
if (c == 'N') {
/* under_print((STR)"印刷を中止しました");*/
return(1);
} else if (c == 'Y') {
break;
}
}
t0 = t;
}
}
OUTLPT(c);
return(0);
}
int
prnt_check_quit()
{
UINT c;
while(1) {
under_print0((STR)"印刷を中止しますか [Y/N]? ");
fep_key_clear();
c = toupper(fep_inkey_raw0());
if (c == 'Y') {
/* under_print((STR)"印刷を中止しました");*/
prnt_out_string(PRN_RESET);
return(1);
} else if (c == 'N') {
break;
}
}
under_print((STR)"印刷を続行します");
return(0);
}
int
prnt_ff()
{
return(prnt_out_string(PRN_FF));
}
/* 新しいドット値を返す */
int
prnt_do_up_margin()
{
register int i;
for(i=PRN_UP_MARGIN/PRN_PIN;i;i--) {
prnt_out_string(PRN_CRLF);
}
return(PRN_UP_MARGIN%PRN_PIN);
}
#if 0
void
prnt_erase_box(int y0,int y1)
{
#asm
movem.l d3/d4,-(sp)
move.l 12(sp),d0
move.l 16(sp),d3
* move.l d0,_sysflag
* move.w d3,_UNDER_Y
move.l d0,d2
cmp.l d2,d3
ble ?476__
move.l #_PRN_PAT,d4
move.l d0,d1
add.l d0,d0
add.l d1,d0
asl.l #3,d0
add.l d1,d0
add.l d0,d0
add.l d1,d0
move.l d0,d1
asl.l #3,d1
?475__:
move.l d1,d0
move.l d4,a1
add.l d0,a1
move.w #407,a0
?474__:
clr.b (a0,a1.l)
subq.w #1,a0
cmp.w #-1,a0
bne ?474__
add.l #408,d1
addq.l #1,d2
cmp.l d2,d3
bgt ?475__
?476__:
movem.l (sp)+,d3/d4
rts
#endasm
}
void
prnt_erase_box(int y0,int y1)
{
register int i,x;
for(i=y0;i<y1;i++) { /* 消去 */
for(x=0;x<PRN_PAT_H;x++) {
PRN_PAT[i][x] = 0;
}
}
}
#else
void
prnt_erase_box(int y0,int y1)
{
#asm
move.l 4(sp),d0
move.l d0,d1
add.l d1,d1 *2
add.l d0,d1 *3
asl.l #3,d1 *24
add.l d0,d1 *25
add.l d1,d1 *50
add.l d0,d1 *51
asl.l #3,d1 *408
move.l d1,a0
add.l #_PRN_PAT,a0 *a0 = ptr
move.l 8(sp),d1
sub.l d0,d1 *y1-y0
move.l d1,d0
add.l d0,d0 *2
add.l d1,d0 *3
asl.l #3,d0 *24
add.l d1,d0 *25
add.l d0,d0 *50
add.l d1,d0 *51
move.l d0,d1
add.l d1,d1 *102
beq ?466__
moveq.l #0,d2
?465__:
move.l d2,(a0)+
dbra d1,?465__
?466__:
rts
#endasm
}
#endif
#define MAX_V 16*30
#define MAX_MEM_PAGE 100
extern PM_UNIT page_last;
UBYTE view1[] = {
0x00, 0x10, 0x10, 0x10, 0x20, 0x30, 0x30, 0x30,
0x20, 0x30, 0x30, 0x30, 0x20, 0x30, 0x30, 0x30,
0x40, 0x50, 0x50, 0x50, 0x60, 0x70, 0x70, 0x70,
0x60, 0x70, 0x70, 0x70, 0x60, 0x70, 0x70, 0x70,
0x40, 0x50, 0x50, 0x50, 0x60, 0x70, 0x70, 0x70,
0x60, 0x70, 0x70, 0x70, 0x60, 0x70, 0x70, 0x70,
0x40, 0x50, 0x50, 0x50, 0x60, 0x70, 0x70, 0x70,
0x60, 0x70, 0x70, 0x70, 0x60, 0x70, 0x70, 0x70,
0x80, 0x90, 0x90, 0x90, 0xa0, 0xb0, 0xb0, 0xb0,
0xa0, 0xb0, 0xb0, 0xb0, 0xa0, 0xb0, 0xb0, 0xb0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0x80, 0x90, 0x90, 0x90, 0xa0, 0xb0, 0xb0, 0xb0,
0xa0, 0xb0, 0xb0, 0xb0, 0xa0, 0xb0, 0xb0, 0xb0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0x80, 0x90, 0x90, 0x90, 0xa0, 0xb0, 0xb0, 0xb0,
0xa0, 0xb0, 0xb0, 0xb0, 0xa0, 0xb0, 0xb0, 0xb0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0,
0xc0, 0xd0, 0xd0, 0xd0, 0xe0, 0xf0, 0xf0, 0xf0,
0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0
};
UBYTE view2[] = {
0x00, 0x01, 0x01, 0x01, 0x02, 0x03, 0x03, 0x03,
0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03,
0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x07, 0x07,
0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07,
0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x07, 0x07,
0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07,
0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x07, 0x07,
0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07,
0x08, 0x09, 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0b,
0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x08, 0x09, 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0b,
0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x08, 0x09, 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0b,
0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f,
0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f,
0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f
};
/* bgnd から hd ドットまでをプレビューする */
/* 画面上での垂直表示増加ドット分を返す */
/* xr,yr : 縮尺レート */
int
prnt_send_1line_to_prn_view(int yyy,int bgnd,int hd,int xr,int yr)
{
register int x,i,xjj;
register STR PAT4 = PAT+4;
register int hd_bgnd = hd-bgnd;
int xjj8;
if (yyy < 0) {
return(0);
}
xjj8 = min((PRN_JIZUME+6)*(12+(PRN_H_PITCH/2))+PRN_LEFT_MARGIN
,PRN_PAT_H*8); /* ドット数 */
xjj = (xjj8/8) + !!(xjj8 & 7); /* バイト数(仮) */
/* xjj が0ということはない */
switch(xr) {
register int wb,c;
register int wbx,cx;
case 1: /* xr = yr = 1 */
for(i=0;i<hd_bgnd;i++) {
for(x=0;x<xjj;x++) {
(PAT4)[i*xjj + x] = PRN_PAT[bgnd+i][x];
}
}
break;
case 2: /* xr = yr = 2 */
for(i=0;i<hd_bgnd;i += 2) {
register int i2xjj2 = (i/2)*(xjj/2);
for(x=0;x<xjj;x += 2) {
(PAT4)[i2xjj2++] = wbx =
view1[PRN_PAT[bgnd+i][x] | PRN_PAT[bgnd+i+1][x]]
| view2[PRN_PAT[bgnd+i][x+1] | PRN_PAT[bgnd+i+1][x+1]];
}
}
break;
case 4:
for(i=0;i<hd_bgnd;i += 4) {
register int i4xjj4 = (i/4)*(xjj/4);
for(x=0;x<xjj;x += 4) {
for(wbx=cx=0;cx<4;cx++) {
wb = PRN_PAT[bgnd+i][x+cx] | PRN_PAT[bgnd+i+1][x+cx]
| PRN_PAT[bgnd+i+2][x+cx] | PRN_PAT[bgnd+i+3][x+cx];
if (wb & 0xf0) wbx |= 128 >> (cx*2);
if (wb & 0x0f) wbx |= 128 >> (cx*2+1);
}
(PAT4)[i4xjj4 + (x/4)] = wbx;
}
}
break;
case 8:
for(i=0;i<hd_bgnd;i += yr) {
register int i8xjj8 = (i/8)*(xjj/8);
for(x=0;x<xjj;x += 8) {
for(wbx=cx=0;cx<8;cx++) {
if (PRN_PAT[bgnd+i][x+cx] | PRN_PAT[bgnd+i+1][x+cx]
| PRN_PAT[bgnd+i+2][x+cx] | PRN_PAT[bgnd+i+3][x+cx]
| PRN_PAT[bgnd+i+4][x+cx] | PRN_PAT[bgnd+i+5][x+cx]
| PRN_PAT[bgnd+i+6][x+cx] | PRN_PAT[bgnd+i+7][x+cx]) {
wbx |= (128 >> cx);
}
}
(PAT4)[i8xjj8 + (x/8)] = wbx;
}
}
break;
default:
error("???1");
}
*((UWORD *) PAT0) = *((UWORD *) PAT) = (xjj*8) / xr;
((UWORD *) PAT0)[1] = ((UWORD *) PAT)[1] = hd / yr;
disp_cursor_off();
/*window0();printf("[%d]",hd);binkey();*/
etc_put_pattern(0,yyy,PAT,NULL);
return(hd/yr);
}
/* 第1頁の先頭を格納する */
/* 格納したインデックスを返す */
int
prnt_vp_store(PM_UNIT page_mem[],UNIT *wp,int bp,int pn)
{
register int i,w;
for(i=0;i<MAX_MEM_PAGE;i++) {
if ((w = page_mem[i].PN) == pn) { /* 既にある */
return(i); /* 何もせずに帰る */
}
if (w == -1) { /* フリーだ */
page_mem[i].LP = wp;
page_mem[i].BP = bp;
page_mem[i].PN = pn;
return(i);
}
}
/* フリーが無い */
for(i=0;i<MAX_MEM_PAGE;i++) {
if (page_mem[i].PN != 1) { /* 先頭頁ではない */
page_mem[i].LP = wp; /* 行をコロス */
page_mem[i].BP = bp;
page_mem[i].PN = pn;
return(i);
}
}
error("???2");
}
/* n 未満の最大を与えるインデックスを返す */
int
prnt_vp_maxi(PM_UNIT page_mem[],int n)
{
register int i,w,max,maxi;
max = page_mem[maxi = 0].PN; /* 最初が初期値 */
for(i=0;i < MAX_MEM_PAGE;i++) {
if (((w = page_mem[i].PN) < n) && (w > 0) && (max > w)) {
max = w;
maxi = i;
}
}
return(maxi);
}
/* page_last を作る */
void
prnt_vp_make_last(PM_UNIT page_mem[])
{
int i;
i = prnt_vp_get(page_mem,0xffff); /* とにかく最大値 */
page_last.LP = page_mem[i].LP;
page_last.BP = page_mem[i].BP;
page_last.PN = page_mem[i].PN;
}
/* wp0 の bp0 から1ページトレースする */
/* 次の wp0 と、bp0 を返す */
/* page_last なら NULL を返す */
UNIT *
prnt_vp_trace_page(UNIT *wp0,int *bp0)
{
register UNIT *wp;
UBYTE ws[VERY_LONG_LINE],w0[VERY_LONG_LINE];
int i;
if (!PAGE) {
*bp0 = 0;
return(NULL); /* last page である */
}
wp = wp0;
i = 0;
if (*bp0) { /* 最初が行の途中からである */
line_get_body(ws,wp);
strcpy(w0,&ws[*bp0]);
wp = wp->ATO;
} else {
*w0 = EOS;
}
while((wp != TAIL) || (*w0)) { /* まだ何か残っている */
if (i++ < PAGE) { /* まだ頁内に留まっている */
if (PRN_JIZUME == CURRENT_JIZUME) {
line_get_body(ws,wp);
wp = wp->ATO;
} else {
if (!*w0) { /* w0 が空ならば */
line_get_body(w0,wp);
wp = wp->ATO;
}
cut_line(w0,ws,w0,PRN_JIZUME);
if (!*w0) { /* 1行取れなかった */
while(1) {
if (wp == TAIL) {
*w0 = EOS;
break;
}
/* 後がある */
strcpy(w0,ws); /* 戻す */
line_cat_body(w0,wp); /* 追加する */
wp = wp->ATO;
cut_line(w0,ws,w0,PRN_JIZUME);
if (*w0) { /* 1行取れた */
break;
}
}
}
}
} else { /* 1頁終了 */
if (!*w0) { /* 残りが無い */
*bp0 = 0;
return(wp);
} else { /* 残りがある */
UBYTE ws[VERY_LONG_LINE];
line_get_body(ws,wp->MAE);
*bp0 = strlen(ws) - strlen(w0);
return(wp->MAE);
}
}
}
/* TAIL に達した */
return(NULL);
}
void
prnt_vp_init(PM_UNIT page_mem[])
{
register int pmc;
for(pmc = 0;pmc < MAX_MEM_PAGE;pmc++) {
page_mem[pmc].PN = -1; /* ページインデックスの初期化 */
}
page_last.PN = -1;
}
/*******************************/
#define MAX_V 16*30
#define MAX_MEM_PAGE 100
#define MAX_MEM_LINE 100
PM_UNIT page_last;
/* pre view */
/* 縦横の圧縮率を与える */
void
prnt_view(UBYTE mode,int xr,int yr)
{
UNIT *wp;
int pn,bp;
PM_UNIT page_mem[MAX_MEM_PAGE];
prnt_vp_init(page_mem); /* ページインデックスの初期化 */
wp = HEAD->ATO;
bp = 0;
pn = 1;
last_pn = -1;
while(1) {
prnt_vp_store(page_mem,wp,bp,pn); /* 登録 */
pn = prnt_do_1page_view(mode,wp,bp,page_mem,pn,xr,yr);
if (pn < 0) {
break;
} else {
int pmc;
pmc = prnt_vp_get(page_mem,pn);
wp = page_mem[pmc].LP;
pn = page_mem[pmc].PN;
bp = page_mem[pmc].BP;
}
}
}
/* 次に処理すべきページ番号を返す */
/* 終了ならば -1 を返す */
int
prnt_do_1page_view(UBYTE mode,UNIT *wp,int bp,PM_UNIT page_mem[],int pn,int xr,int yr)
{
UBYTE work[MAXLINE];
UINT c;
int i,flag;
init_clear_screen();
while(1) {
if (mode == 'V'-'@') { /* 連続モード */
flag = fep_INKEY();
if ((flag == 'G'-'@') || (flag == '['-'@')) {
return(-1);
}
/*window0();printf("(%d),(%d)",last_pn,pn);binkey();*/
if (pn == last_pn) {
return(-1);
}
last_pn = pn;
}
flag = prnt_do_1page_view_sub(mode,&wp,&bp,pn,page_mem,xr,yr);
pager_key:
prnt_repo_view(pn,wp);
if (mode == 'V') {
if (!flag) {
disp_cursor_on();
fep_key_clear();
c = fep_inkey_raw0();
disp_cursor_off();
} else {
c = flag;
}
/*
etc_beep();etc_beep();etc_beep();
window0();printf("[%x]",c);binkey();
*/
switch(c) {
case 'G'-'@':
/* case 'C'-'@':*/
case '['-'@':
return(-1); /* 終了 */
case 0x201: /* [F1] *//* 最初の頁へ */
return(1);
case 0x202: /* [F2] *//* 最後の頁へ */
if (page_last.PN == -1) { /* まだみてない */
/* ドロナワで作る */
prnt_vp_make_last(page_mem);
}
return(page_last.PN);
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': /* 10進数である */
i = 0; /* 始め */
work[i++] = c;
work[i] = EOS;
/*error("1");*/
prnt_repo_view_num(work); /* エコーバック */
/*error("2");*/
while(1) {
if (isdigit(c = fep_inkey_raw0())) {
if (i < 8) {
work[i++] = c;
work[i] = EOS;
} else {
fep_key_clear();
etc_beep();
}
} else if (c == 'H'-'@') { /* BS */
if (i) {
work[--i] = EOS;
}
} else if (c == '\x1b') {
work[0] = EOS;
break;
} else {
break;
}
prnt_repo_view_num(work); /* エコーバック */
}
if ((c == CR) || (c == 'M'-'@')) { /* CR で終了 */
if ((i = atoi(work)) > 0) {
return(i);
}
}
/* 変なキー入力で終了 */
etc_beep();
goto pager_key;
default:
if (c == XF_BEFORE_PAGE_KEY) { /* ROLL DN */
if (pn > 1) {
return(page_mem[prnt_vp_get(page_mem,pn-1)].PN);
} else {
etc_beep();
return(1);
}
}
/* 何か他 */
/*
etc_beep();etc_beep();etc_beep();
window0();printf("[%x]",c);binkey();
*/
if (wp == TAIL) {
if ((c == XF_NEXT_PAGE_KEY) || (c == FEP_HELP_CODE)) { /* ROLL UP */
return(pn);
}
return(-1);
} else {
return(pn+1);
}
}
} else { /* ^V だ */
if (wp == TAIL) {
return(-1);
} else {
return(pn+1);
}
}
}
}
/* 表示する */
/* 上下にスクロールする */
/* wp と bp を更新する */
/* 終了フラグを返す */
int
prnt_do_1page_view_sub(UBYTE mode,UNIT **wpp,int *bp0,int pn,PM_UNIT page_mem[],int xr,int yr)
{
int up,dn; /* 表示している範囲 */
int yc,yc0; /* y カウンタ */
UNIT *wp,*p;
int bp;
UBYTE w0[VERY_LONG_LINE];
int yhaba = (((LYW_UPPER+LYW_MAIN+LYW_UNDER)*3/2)+PRN_V_PITCH)/yr;
int yh,ygeta;
int ii;
UINT c;
PM_UNIT line_mem[MAX_MEM_LINE];
wp = *wpp;
bp = *bp0;
ii = 0;
prnt_vp_init_line(line_mem);
yc = 0;
prnt_vp_store_line(line_mem,wp,bp,ii); /* 記録 */
/* 表示出来る分だけ表示する */
while((ii < PAGE) && ((yc + yhaba) < 30*16) && (wp != TAIL)) { /* もう1行処理できる */
/* yc から1行処理 */
prnt_vp_trace_line(&wp,&bp,w0); /* w0 に1行分入る */
ii++;
prnt_vp_store_line(line_mem,wp,bp,ii); /* 記録 */
yh = prnt_bit_convrt_24(w0,0,LYW_UPPER,LYW_MAIN,LYW_UNDER,PRN_JIZUME);
yc += prnt_send_1line_to_prn_view(yc,0,yh,xr,yr);
}
if ((ii >= PAGE) || (wp == TAIL)) { /* 表示しきった */
*wpp = wp;
*bp0 = bp;
return(0);
}
if (mode == 'V'-'@') { /* 連続モード */
return(0);
}
/* 表示しきってないのでスクロール作業が必要 */
up = 0; /* 最上行 */
dn = ii-1; /* 最下行 */
ygeta = 0;
yc0 = 0; /* 上点 */
/*
window0();
printf("(%d)(%d)",up,dn);
getchar();
*/
ii = prnt_vp_get_line(line_mem,dn);
p = line_mem[ii].LP;
while(1) {
UBYTE ww[MAXLINE];
if (p == TAIL) {
sprintf(ww," %d 頁目(最終)([F1]=最初, [F2]=最後, \\
[ROLL DOWN]=前頁, 数値+NL=その頁, [ESC]=中止)…",pn);
} else {
sprintf(ww," %d 頁目([F1]=最初, [F2]=最後, \\
[ROLL DOWN]=前頁, 数値+NL=その頁, [ESC]=中止)…",pn);
}
if (up) { /* ↑ 可能 */
strcat(ww,"↑");
}
if ((dn != (PAGE - 1)) && (wp != TAIL)) { /* ↓ 可能 */
strcat(ww,"↓");
}
strcat(ww,"でスクロール");
under_print_view(ww);
disp_cursor_on();
fep_key_clear();
/*error("@");*/
c = fep_inkey_raw0();
/*error("@@");*/
disp_cursor_off();
if ((c == XF_NEXT_BLOCK_KEY) && (dn != (PAGE - 1)) && (wp != TAIL)) { /* 下向き矢印 */
/* 1行スクロールアップ */
int yoyuu;
yoyuu = 30*16 - yc; /* 下にこれだけ余裕がある */
ygeta = prnt_view_scroll_up(yhaba-yoyuu);
/* yhaba を確保するためにはこれだけスクロールする必要がある */
yc -= ygeta; /* 結局下点はこれだけ上がった */
yc0 -= ygeta; /* 上点もこれだけ上がる */
up++;
dn++; /* 1行すすむ */
/* dn を表示 */
ii = prnt_vp_get_line(line_mem,dn);
wp = line_mem[ii].LP;
bp = line_mem[ii].BP;
if (wp == TAIL) {
continue;
/* *wpp = wp;
*bp0 = bp;
return(0);*/
}
prnt_vp_trace_line(&wp,&bp,w0); /* w0 に1行分入る */
prnt_vp_store_line(line_mem,wp,bp,dn+1); /* 記録 */
yh = prnt_bit_convrt_24(w0,0,LYW_UPPER,LYW_MAIN,LYW_UNDER,PRN_JIZUME);
prnt_send_1line_to_prn_view(yc,0,yh,xr,yr);
yc += yhaba; /* 表示したから下点は yhaba 下がる */
yc0 += yhaba; /* 1行たぐるからこうなる */
/*window0();printf("(%d)(%d)[%d]",yc,yc0,ygeta);*/
/*sprintf(ww,"(%d)(%d)[%d]",yc,yc0,ygeta);under_print0(ww);*/
} else if ((c == XF_BEFORE_BLOCK_KEY) && up) { /* 上向き矢印 */
/* 1行スクロールダウン */
int yoyuu;
yoyuu = yc0; /* 上にこれだけ余裕がある */
ygeta = prnt_view_scroll_dn(yhaba-yoyuu);
/* yhaba を確保するためにはこれだけスクロールする必要がある */
yc0 += ygeta; /* 上点はこれだけ下がった */
yc += ygeta; /* 下点もこれだけ下がる */
yc0 -= yhaba; /* 表示すべき上点は yhaba 上 */
yc -= yhaba; /* 1行たぐるからこうなる */
up--;
dn--;
/* up を表示 */
ii = prnt_vp_get_line(line_mem,up);
wp = line_mem[ii].LP;
bp = line_mem[ii].BP;
prnt_vp_trace_line(&wp,&bp,w0); /* w0 に1行分入る */
yh = prnt_bit_convrt_24(w0,0,LYW_UPPER,LYW_MAIN,LYW_UNDER,PRN_JIZUME);
prnt_send_1line_to_prn_view(yc0,0,yh,xr,yr);
/*sprintf(ww,"(%d)(%d)",yc,yc0);under_print0(ww);*/
} else if ((c == XF_NEXT_BLOCK_KEY) || (c == XF_BEFORE_BLOCK_KEY)) {
continue; /* 何もしない */
} else {
*wpp = wp;
*bp0 = bp;
/*error("A");*/
return(c); /* END or NEXT PAGE */
}
}
}
/* バッファ上にイメージを展開する */
/* 新しいドット値を返す */
int
prnt_do_up_margin_view(int xr,int yr)
{
register int i;
init_clear_screen();
return(PRN_UP_MARGIN/yr);
}
void
prnt_repo_view_num(STR p)
{
UBYTE w[MAXLINE];
sprintf(w,"頁数指定(終了=<NL>, 中止=[ESC])*%s",p);
/*
window0();
printf("[%s]",w);binkey();
*/
under_print_view(w);
}
/* p == TAIL なら、その旨表示 */
void
prnt_repo_view(int pn,UNIT *p)
{
UBYTE w[MAXLINE*2];
if (p == TAIL) {
sprintf(w," %d 頁目(最終)([F1]=最初, [F2]=最後, \\
[ROLL DOWN]=前頁, 数値+NL=その頁, [ESC]=中止)…",pn);
} else {
sprintf(w," %d 頁目([F1]=最初, [F2]=最後, \\
[ROLL DOWN]=前頁, 数値+NL=その頁, [ESC]=中止)…",pn);
}
under_print_view(w);
}
/* 第n頁の先頭を求める */
/* インデックスを返す */
int
prnt_vp_get(PM_UNIT page_mem[],int n)
{
register int i,w,max,maxi;
int bp;
UNIT *wp;
for(i=0;i<MAX_MEM_PAGE;i++) {
if (page_mem[i].PN == n) { /* ヒット */
return(i);
}
}
/* 無い */
/* 作って返す */
maxi = prnt_vp_maxi(page_mem,n);
max = page_mem[maxi].PN;
wp = page_mem[maxi].LP;
bp = page_mem[maxi].BP;
i = maxi;
for(;max < n;max++) {
if (wp = prnt_vp_trace_page(wp,&bp)) { /* 有効な頁である */
i = prnt_vp_store(page_mem,wp,bp,max+1); /* 保存する */
/*
window0();
printf("[%d]\n",bp);binkey();
*/
} else { /* 終わりに達した */
/* 最後の頁を返す */
break;
}
}
/* 達した */
return(i);
}
/*************************************************/
/* 行の先頭を格納する */
/* 格納したインデックスを返す */
int
prnt_vp_store_line(PM_UNIT line_mem[],UNIT *wp,int bp,int pn)
{
register int i,w;
for(i=0;i<MAX_MEM_LINE;i++) {
if ((w = line_mem[i].PN) == pn) { /* 既にある */
return(i); /* 何もせずに帰る */
}
if (w == -1) { /* フリーだ */
line_mem[i].LP = wp;
line_mem[i].BP = bp;
line_mem[i].PN = pn;
return(i);
}
}
/* フリーが無い */
for(i=0;i<MAX_MEM_LINE;i++) {
if (line_mem[i].PN != 0) { /* 先頭頁ではない */
line_mem[i].LP = wp; /* 行をコロス */
line_mem[i].BP = bp;
line_mem[i].PN = pn;
return(i);
}
}
error("???3");
}
/* n 未満の最大を与えるインデックスを返す */
int
prnt_vp_maxi_line(PM_UNIT line_mem[],int n)
{
register int i,w,max,maxi;
max = line_mem[maxi = 0].PN; /* 最初が初期値 */
for(i=0;i < MAX_MEM_LINE;i++) {
if (((w = line_mem[i].PN) < n) && (w > 0) && (max > w)) {
max = w;
maxi = i;
}
}
return(maxi);
}
/* wp の bp から1行トレースし、rets に文字列を返す */
/* rets が NULL ならトレースし、次の行へのポインタを返すだけ */
/* 次の wp と、bp を返す */
/* TAIL に達したら wp に TAIL を返す */
void
prnt_vp_trace_line(UNIT **wp0,int *bp0,STR rets)
{
UNIT *wp;
int bp;
UBYTE ws[VERY_LONG_LINE],w0[VERY_LONG_LINE];
int i;
wp = *wp0;
bp = *bp0;
if (PRN_JIZUME == CURRENT_JIZUME) { /* これなら面倒はない */
if (rets) {
line_get_body(rets,wp);
}
wp = wp->ATO;
*wp0 = wp;
*bp0 = bp;
return;
}
line_get_body(w0,wp);
wp = wp->ATO;
if (bp) {
strcpy(w0,&w0[bp]);
}
cut_line(w0,ws,w0,PRN_JIZUME);
if (!*w0) { /* 1行取れなかった */
while(1) {
if (wp == TAIL) {
*w0 = EOS;
break;
}
/* 後がある */
strcpy(w0,ws); /* 戻す */
line_cat_body(w0,wp); /* 追加する */
wp = wp->ATO;
cut_line(w0,ws,w0,PRN_JIZUME);
if (*w0) { /* 1行取れた */
break;
}
}
}
if (*w0) {
*bp0 = line_length(*wp0 = wp->MAE) - strlen(w0);
} else {
*wp0 = wp;
*bp0 = bp;
}
if (rets) {
strcpy(rets,ws);
}
return;
}
void
prnt_vp_init_line(PM_UNIT line_mem[])
{
register int pmc;
for(pmc = 0;pmc < MAX_MEM_LINE;pmc++) {
line_mem[pmc].PN = -1; /* ページインデックスの初期化 */
}
page_last.PN = -1;
}
/* 第n行の先頭を求める */
/* インデックスを返す */
int
prnt_vp_get_line(PM_UNIT line_mem[],int n)
{
register int i,w,max,maxi;
int bp;
UNIT *wp;
for(i=0;i<MAX_MEM_LINE;i++) {
if (line_mem[i].PN == n) { /* ヒット */
return(i);
}
}
/* 無い */
/* 作って返す */
maxi = prnt_vp_maxi_line(line_mem,n);
max = line_mem[maxi].PN;
wp = line_mem[maxi].LP;
bp = line_mem[maxi].BP;
i = maxi;
for(;max < n;max++) {
prnt_vp_trace_line(&wp,&bp,NULL);
if (wp == TAIL) {
break;
} else {
i = prnt_vp_store_line(line_mem,wp,bp,max+1); /* 保存する */
}
}
/* 達した */
return(i);
}
/* yhaba を越えるだけの4ラスタブロックをスクロールアップする */
/* 実際にスクロールしたラスタ数を返す */
int
prnt_view_scroll_up(int yhaba)
{
register int i,ii;
i = yhaba>>2;
if (yhaba & 3) {
i++;
}
for(ii=0;ii<i;ii++) {
TXRASCPY(1*256+0,(30*16/4)-1,3);
}
i *= 4;
etc_era_box(0,30*16-i,95,i);
return(i);
}
/* yhaba を越えるだけの4ラスタブロックをスクロールダウンする */
/* 実際にスクロールしたラスタ数を返す */
int
prnt_view_scroll_dn(int yhaba)
{
register int i,ii;
i = yhaba>>2;
if (yhaba & 3) {
i++;
}
for(ii=0;ii<i;ii++) {
TXRASCPY(((30*16/4)-1)*256+(30*16/4),(30*16/4)-0,3 | 0x8000);
}
i *= 4;
etc_era_box(0,0,95,i);
return(i);
}
/* プリンタパラメータのダイレクト数値入力 */
void
prnt_direct_number(int xp,UBYTE c)
{
int n;
n = c - '0';
while(1) {
switch(xp) {
case 0:
/* PRN_TATE_MODE = !PRN_TATE_MODE;*/
etc_beep();
return;
break;
case 1:
PRN_JIZUME = n;
break;
case 2:
PAGE = n;
break;
case 3:
PRN_UP_MARGIN = n;
break;
case 4:
PRN_LEFT_MARGIN = n;
break;
case 5:
PRN_H_PITCH = n;
break;
case 6:
if ((c == '0') && (n > 50)) {
n = 0;
}
PRN_V_PITCH = min(n,50);
break;
default:
etc_beep();
return;
break;
}
prnt_do_disp(xp);
fep_key_clear();
c = toupper(fep_inkey_raw0());
if (('0' <=c) && (c <= '9')) { /* 数字入力 */
n = (n*10 + (c-'0')) % 1000;
} else {
fep_push_key(c);
return;
}
}
}
void
prnt_direct_number2(int xp,UBYTE c)
{
int n;
n = c - '0';
while(1) {
switch(xp) {
case 0:
prnt_top = n;
break;
case 1:
prnt_last = n;
break;
case 2:
etc_beep();
return;
/* prnt_pitch = !prnt_pitch;*/
break;
default:
etc_beep();
return;
break;
}
prnt_do_disp_2(xp);
fep_key_clear();
c = toupper(fep_inkey_raw0());
if (('0' <=c) && (c <= '9')) { /* 数字入力 */
n = (n*10 + (c-'0')) % 1000;
} else {
fep_push_key(c);
return;
}
}
}